home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / make / icmake-6.000 / icmake-6 / icmake / comp / ifstmnt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-08  |  1.5 KB  |  64 lines

  1. /*
  2.                             I F S T M N T . C
  3. */
  4.  
  5. #include "iccomp.h"
  6.  
  7. ESTRUC_ *if_stmnt(e, s, s2)
  8.     ESTRUC_
  9.         *e,
  10.         *s,
  11.         *s2;
  12. {
  13.     register unsigned
  14.         len;
  15.     unsigned
  16.         *list;
  17.  
  18.     nestlevel--;                            /* reduce nesting level */
  19.  
  20.     etob(e);                                /* make links for E */
  21.  
  22.     if (test_type(e, e_const))              /* constant: either always/never */
  23.     {
  24.         discard(e);
  25.         if (e->evalue)                      /* S always executed */
  26.         {
  27.             discard(s2);
  28.             return (s);
  29.         }
  30.         else                                /* S2 always executed */
  31.         {
  32.             discard(s);
  33.             return (s2);
  34.         }
  35.     }
  36.  
  37.     patchup_true(e, 1);                     /* patch to EOC */
  38.  
  39.     if (!s2->type)                          /* no S2 */
  40.     {
  41.         catcode(e, s);                      /* E = E ~ S */
  42.         return (e);
  43.     }
  44.  
  45.     gencode(s, op_jmp, j_falselist);
  46.  
  47.     list = s->falselist;                    /* save the falselist */
  48.     len  = s->falselen;
  49.  
  50.     addpatch(list, len, e->codelen);       /* increase the patch targets */
  51.  
  52.     s->falselen = 0;
  53.  
  54.     catcode(e, s);                          /* E = E ~ S */
  55.     patchup_false(e, 1);                   /* patch to EOC */
  56.  
  57.     e->falselen = len;                      /* restore the falselist */
  58.     e->falselist = list;
  59.  
  60.     catcode(e, s2);                         /* if .. else cat. */
  61.  
  62.     return (e);                             /* if .. else return */
  63. }
  64.